Стас Орлов, Причем тут урон?
constant - в JASS флаг, указывающий что данный обьект можно только читать, а не записывать, если тебе так проще. Других функций у него нет.
constant native GetEventDamage takes nothing returns real
Что означает данная константа?
Событие юнит получает урон регистрируется на конкретного юнита.
Для того что бы отлавливать урон по цели твоего "щита", нужно создать для цели (т.е. для того юнита, на которого накладывают щит) отдельное событие на получением им урона. И делать это надо именно в тот момент, когда ты накладываешь щит.
Для этого есть функция добавить событие в триггер, в ней можно указать конкретного юнита и само событие получения урона. Дальше тебе придётся только лишь определить был ли юнит в момент получения урона под действием "щита" и дальше блокировать урона (восстанавливать хп юнита).
Так же надо отметить момент, что если ты для юнита создаёшь больше ОДНОГО события на получение урона - они будут работать каждый сам по себе (т.е. при получении урона 1 раз, будут срабатывать 2 события, и триггер будет срабатывать ДВА раза = больше события и больше срабатываний в один момент времени).
Для этого надо маркеровать юнитов, для которых создаётся событие на получение урона (например заносить их в группу юнитов, а перед этим проверять есть ли юнит в этой группе).
Вот мой код на момент навешивания щита:
function Trig_Unholy_shield_1_Jass_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'A00V' ) ) then
return false
endif
return true
endfunction
function Trig_Unholy_shield_1_Jass_Actions takes nothing returns nothing
local real shieldBlock Число, которое показывает колличество блокируемого урона
local real hp Число, которое показывает колличество жизней юнита на момент наложения щита
local unit w = GetSpellTargetUnit() Юнит, на которого повешен щит
local integer h Нужна для проверки соответствия после
local integer j = GetHandleId(w) Узнаём ID юнита, на которого повешен щит
set shieldBlock = 150.00
set hp = GetUnitStateSwap(UNIT_STATE_LIFE, GetSpellTargetUnit())
set h = j
call SaveUnitHandle(udg_hash,j,1,w)
call SaveReal(udg_hash,j,2,shieldBlock)
call SaveReal(udg_hash,j,3,hp)
call SaveInteger(udg_hash,j,4, h)
set w = null
call EnableTrigger( gg_trg_Unholy_shield_2_v2_Jass )
endfunction
===========================================================================
function InitTrig_Unholy_shield_1_Jass takes nothing returns nothing
set gg_trg_Unholy_shield_1_Jass = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Unholy_shield_1_Jass, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Unholy_shield_1_Jass, Condition( function Trig_Unholy_shield_1_Jass_Conditions ) )
call TriggerAddAction( gg_trg_Unholy_shield_1_Jass, function Trig_Unholy_shield_1_Jass_Actions )
endfunction
А это код для срабатывания щита:
function Trig_w_Actions takes nothing returns nothing
local unit attacked = GetAttackedUnitBJ()
local integer j = GetHandleId(attacked)
local real hpA = GetUnitStateSwap(UNIT_STATE_LIFE, GetAttackedUnitBJ())
local real uron
local unit a = LoadUnitHandle(udg_hash, j,1)
local real shieldBlock = LoadReal(udg_hash, j,2)
local real hp = LoadReal(udg_hash, j,3)
local integer h = LoadInteger(udg_hash, j,4)
local real Yron2
set uron = ( hp - hpA )
if ( shieldBlock > 0.00 ) then
if ( shieldBlock > uron) then
call SetUnitLifeBJ( GetAttackedUnitBJ(), ( GetUnitStateSwap(UNIT_STATE_LIFE, GetAttackedUnitBJ()) + uron ) )
set shieldBlock = ( shieldBlock - uron )
call SaveReal(udg_hash,j,2,shieldBlock)
else
set Yron2 = (uron - shieldBlock)
call SetUnitLifeBJ( GetAttackedUnitBJ(), ( GetUnitStateSwap(UNIT_STATE_LIFE, GetAttackedUnitBJ()) + Yron2 ) )
set shieldBlock = ( shieldBlock - uron )
call SaveReal(udg_hash,j,2,shieldBlock)
endif
else
if ( shieldBlock <= 0.00 ) then
call UnitRemoveBuffBJ( 'B009', GetTriggerUnit() )
endif
endif
endfunction
===========================================================================
function InitTrig_Unholy_shield_2_v2_Jass takes nothing returns nothing
set gg_trg_Unholy_shield_2_v2_Jass = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Unholy_shield_2_v2_Jass, EVENT_PLAYER_UNIT_ATTACKED )
call TriggerAddAction( gg_trg_Unholy_shield_2_v2_Jass, function Trig_w_Actions )
endfunction
Я не до конца понимаю несколько вещей. Где мне найти функцию на добавление в триггер и как проверить наложен ли щит(я только так придумал), т.к. не знаю как проверить имеется ли щит на юните.
Понимаю что много прошу. но всё же, можно разьяснить это в коде? Пожалуйста
Событие юнит получает урон регистрируется на конкретного юнита.
Для того что бы отлавливать урон по цели твоего "щита", нужно создать для цели (т.е. для того юнита, на которого накладывают щит) отдельное событие на получением им урона. И делать это надо именно в тот момент, когда ты накладываешь щит.
Для этого есть функция добавить событие в триггер, в ней можно указать конкретного юнита и само событие получения урона. Дальше тебе придётся только лишь определить был ли юнит в момент получения урона под действием "щита" и дальше блокировать урона (восстанавливать хп юнита).
Так же надо отметить момент, что если ты для юнита создаёшь больше ОДНОГО события на получение урона - они будут работать каждый сам по себе (т.е. при получении урона 1 раз, будут срабатывать 2 события, и триггер будет срабатывать ДВА раза = больше события и больше срабатываний в один момент времени).
Для этого надо маркеровать юнитов, для которых создаётся событие на получение урона (например заносить их в группу юнитов, а перед этим проверять есть ли юнит в этой группе).
Вот мой код на момент навешивания щита:
function Trig_Unholy_shield_1_Jass_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'A00V' ) ) then
return false
endif
return true
endfunction
function Trig_Unholy_shield_1_Jass_Actions takes nothing returns nothing
local real shieldBlock Число, которое показывает колличество блокируемого урона
local real hp Число, которое показывает колличество жизней юнита на момент наложения щита
local unit w = GetSpellTargetUnit() Юнит, на которого повешен щит
local integer h Нужна для проверки соответствия после
local integer j = GetHandleId(w) Узнаём ID юнита, на которого повешен щит
set shieldBlock = 150.00
set hp = GetUnitStateSwap(UNIT_STATE_LIFE, GetSpellTargetUnit())
set h = j
call SaveUnitHandle(udg_hash,j,1,w)
call SaveReal(udg_hash,j,2,shieldBlock)
call SaveReal(udg_hash,j,3,hp)
call SaveInteger(udg_hash,j,4, h)
set w = null
call EnableTrigger( gg_trg_Unholy_shield_2_v2_Jass )
endfunction
===========================================================================
function InitTrig_Unholy_shield_1_Jass takes nothing returns nothing
set gg_trg_Unholy_shield_1_Jass = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Unholy_shield_1_Jass, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Unholy_shield_1_Jass, Condition( function Trig_Unholy_shield_1_Jass_Conditions ) )
call TriggerAddAction( gg_trg_Unholy_shield_1_Jass, function Trig_Unholy_shield_1_Jass_Actions )
endfunction
А это код для срабатывания щита:
function Trig_w_Actions takes nothing returns nothing
local unit attacked = GetAttackedUnitBJ()
local integer j = GetHandleId(attacked)
local real hpA = GetUnitStateSwap(UNIT_STATE_LIFE, GetAttackedUnitBJ())
local real uron
local unit a = LoadUnitHandle(udg_hash, j,1)
local real shieldBlock = LoadReal(udg_hash, j,2)
local real hp = LoadReal(udg_hash, j,3)
local integer h = LoadInteger(udg_hash, j,4)
local real Yron2
set uron = ( hp - hpA )
if ( shieldBlock > 0.00 ) then
if ( shieldBlock > uron) then
call SetUnitLifeBJ( GetAttackedUnitBJ(), ( GetUnitStateSwap(UNIT_STATE_LIFE, GetAttackedUnitBJ()) + uron ) )
set shieldBlock = ( shieldBlock - uron )
call SaveReal(udg_hash,j,2,shieldBlock)
else
set Yron2 = (uron - shieldBlock)
call SetUnitLifeBJ( GetAttackedUnitBJ(), ( GetUnitStateSwap(UNIT_STATE_LIFE, GetAttackedUnitBJ()) + Yron2 ) )
set shieldBlock = ( shieldBlock - uron )
call SaveReal(udg_hash,j,2,shieldBlock)
endif
else
if ( shieldBlock <= 0.00 ) then
call UnitRemoveBuffBJ( 'B009', GetTriggerUnit() )
endif
endif
endfunction
===========================================================================
function InitTrig_Unholy_shield_2_v2_Jass takes nothing returns nothing
set gg_trg_Unholy_shield_2_v2_Jass = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Unholy_shield_2_v2_Jass, EVENT_PLAYER_UNIT_ATTACKED )
call TriggerAddAction( gg_trg_Unholy_shield_2_v2_Jass, function Trig_w_Actions )
endfunction
Я не до конца понимаю несколько вещей. Где мне найти функцию на добавление в триггер и как проверить наложен ли щит(я только так придумал), т.к. не знаю как проверить имеется ли щит на юните.
Понимаю что много прошу. но всё же, можно разьяснить это в коде? Пожалуйста
Понимаю, что код не идеален, сам много особенностей нашёл. например, что он востанавливает хп, но если вылечить, то он вернёт хп к тому моменту, когда щит наложили. И если юнита убивают под щитом, то щит не поможет
Константа - постоянная, переменная которая не меняется в процессе игры.
Технически переменная которая не меняется, из за флага.
constant integer SPELL_ID = 'A000' // для переменной
constant function GetSpellId takes nothing returns integer // для функции
return 'A000'
endfunction
Это мало что дает, обычно юзают для выделения переменных или функций которые нужны для настроек кода, очень широко применяется во всяких "заклинаниях на заказ" где целая туча параметров.
Никакой скорости и прочего бреда это недает, все тоже самое что и простые переменные \ функции.
А что означает конкретная константа? Я думал она считает полученный урон или срабатывает в момент нанесения оного
"set dead = " и обращаешься к этой же переменной внутри назначения, действительно, почему же не работает?
Юзай другую переменную для создания
Ошибка не в этом. Когда ч воскрешал юнита моментально, то такая запись создания юнита работала. Ошибка в том, что, когда я переношу через таблицу юнита и потом создаю юнита его типа, игроку-владельцу прошлого юнита, то он не запоминает его. ВОт это я не пойму почему. Видимо проходит слишком много времени после его смерти и он исчезает с хеш-таблицы, а как это исправить, я не знаю, повторюсь, ЮНИТА, не ГЕРОЯ,
сохрани как то ссылку на здание к которому принадлежат юниты, когда юнит умрет, по этой ссылке нужно проверять здание на котором они висят, это то о чем тебе написали выше
здание знает какие юниты на нем висят, а юниты должны знать к какому зданию они привязаны
Для каждого юнита прикрепляй в хеш строение (по id юнита). При смерти узнавай строение, по нему группу, создавай нового юнита и добавляй его в эту группу (или для каждого строения заведи счётчик мёртвых юнитов и потом создавай нужное количество).
Не совсем понял, что значит прикрепляй в хеш строение? То есть, когда я тригерно создаю вокруг сдания юнитов, нижно по отдельности добавить каждого из них в хеш таблицу или имеется ввиду добавить три несколько раз одно и тоже здание по нескольким ключам? А можно примерный код показать? Я не до конца понимаю, как это должно выглядеть(
local unit q //Юнит, который добавляется в группу
local unit w = GetTriggerUnit() //Юнит, который триггерит триггер
local group g = CreateGroup() //Группа, в которую все юниты входят
local integer j = GetHandleId(w) //Узнаём ID юнита, который триггерит триггер
set q = CreateUnit(GetOwningPlayer(w), 'h00C', GetUnitX(w), GetUnitY(w), bj_UNIT_FACING)
GroupAddUnit(g, q)
// дальше сами...
ВЫ мой спаситель, около суток парился с этим, а там так просто. Огромнейшее спасибо!
замечание от NazarPunk: 1.1 (ненормативная лексика)
Событие: каждые 0.03 секунды.
Условие: -
Действие: Выбрать всех юнитов типа (х) на расстоянии 5000+ от (нужного тебе юнита) и убить их.
2). Вариант.
Событие: каждые 0.03 секунды.
Условие: -
Действие: Выбрать всех юнитов типа (х)
Если расстояние между (х) и (нужным юнитом) больше 5000
Убить выбранного юнита.
Да я не об этом. Я говорю про то, что как запустить их с разных сторон. Вот я ставлю область и пишу, если юнит игрока 1 проходит через область, то идёт дальше, но если игрок 1 пробил 2, то, когда он дойдет до той области, он пойдет обратно, а не дальше.
Название: Шрапнель
Метод: GUI/Jass(только если подробно объясните, что да как, чтобы я мог потом делать подобные)
MUI: обязательно
Цель применения: область с радиусом 200 .
Количество уровней: 3
Описание: Это способность, которая даёт юниту возможность с шансом в 20% нанести х урона по области в позиции атакованного юнита с радиусом 200.
1 уровень 50-200 урона.
2 уровень 100-400 урона.
3 уровень 150-600 урона.
Что значит для гуишников? Гуи это то, где создаются тригером с определенными упрощениями. Но ведь этот триггерными в коде, значит всё равно придется его писатт, а значит конвертировать. Или я что-то не понимаю?
» WarCraft 3 / команда на входящий урон
» WarCraft 3 / команда на входящий урон
» WarCraft 3 / Константы в jass
Что означает данная константа?
» WarCraft 3 / команда на входящий урон
function Trig_Unholy_shield_1_Jass_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'A00V' ) ) then
return false
endif
return true
endfunction
local real shieldBlock Число, которое показывает колличество блокируемого урона
local real hp Число, которое показывает колличество жизней юнита на момент наложения щита
local unit w = GetSpellTargetUnit() Юнит, на которого повешен щит
local integer h Нужна для проверки соответствия после
local integer j = GetHandleId(w) Узнаём ID юнита, на которого повешен щит
set shieldBlock = 150.00
set hp = GetUnitStateSwap(UNIT_STATE_LIFE, GetSpellTargetUnit())
set h = j
call SaveUnitHandle(udg_hash,j,1,w)
call SaveReal(udg_hash,j,2,shieldBlock)
call SaveReal(udg_hash,j,3,hp)
call SaveInteger(udg_hash,j,4, h)
set w = null
call EnableTrigger( gg_trg_Unholy_shield_2_v2_Jass )
endfunction
function InitTrig_Unholy_shield_1_Jass takes nothing returns nothing
set gg_trg_Unholy_shield_1_Jass = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Unholy_shield_1_Jass, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Unholy_shield_1_Jass, Condition( function Trig_Unholy_shield_1_Jass_Conditions ) )
call TriggerAddAction( gg_trg_Unholy_shield_1_Jass, function Trig_Unholy_shield_1_Jass_Actions )
endfunction
function Trig_w_Actions takes nothing returns nothing
local unit attacked = GetAttackedUnitBJ()
local integer j = GetHandleId(attacked)
local real hpA = GetUnitStateSwap(UNIT_STATE_LIFE, GetAttackedUnitBJ())
local real uron
local unit a = LoadUnitHandle(udg_hash, j,1)
local real shieldBlock = LoadReal(udg_hash, j,2)
local real hp = LoadReal(udg_hash, j,3)
local integer h = LoadInteger(udg_hash, j,4)
local real Yron2
set uron = ( hp - hpA )
if ( shieldBlock > 0.00 ) then
if ( shieldBlock > uron) then
call SetUnitLifeBJ( GetAttackedUnitBJ(), ( GetUnitStateSwap(UNIT_STATE_LIFE, GetAttackedUnitBJ()) + uron ) )
set shieldBlock = ( shieldBlock - uron )
call SaveReal(udg_hash,j,2,shieldBlock)
else
set Yron2 = (uron - shieldBlock)
call SetUnitLifeBJ( GetAttackedUnitBJ(), ( GetUnitStateSwap(UNIT_STATE_LIFE, GetAttackedUnitBJ()) + Yron2 ) )
set shieldBlock = ( shieldBlock - uron )
call SaveReal(udg_hash,j,2,shieldBlock)
endif
else
if ( shieldBlock <= 0.00 ) then
call UnitRemoveBuffBJ( 'B009', GetTriggerUnit() )
endif
endif
endfunction
function InitTrig_Unholy_shield_2_v2_Jass takes nothing returns nothing
set gg_trg_Unholy_shield_2_v2_Jass = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Unholy_shield_2_v2_Jass, EVENT_PLAYER_UNIT_ATTACKED )
call TriggerAddAction( gg_trg_Unholy_shield_2_v2_Jass, function Trig_w_Actions )
endfunction
» WarCraft 3 / Константы в jass
» WarCraft 3 / Есть ли jass функция урона юнита?
» WarCraft 3 / Хеш-таблица и юнит
» WarCraft 3 / Ох уж эти Хеш-таблицы
» WarCraft 3 / Ох уж эти Хеш-таблицы
Ред. nazarpunk
» WarCraft 3 / Проблема с переменной типа group
» WarCraft 3 / Еда
» WarCraft 3 / Исследование и пасивка
» WarCraft 3 / Убивать вне радиуса области относительно юнита - триггерно
Условие: -
Действие: Выбрать всех юнитов типа (х) на расстоянии 5000+ от (нужного тебе юнита) и убить их.
Событие: каждые 0.03 секунды.
Условие: -
Действие: Выбрать всех юнитов типа (х)
Если расстояние между (х) и (нужным юнитом) больше 5000
Убить выбранного юнита.
» WarCraft 3 / Исследование и пасивка
» WarCraft 3 / Сюрв
» WarCraft 3 / Скейл
» WarCraft 3 / Призрачная модель
» WarCraft 3 / Переменная
pro100master:
pro100master:
» WarCraft 3 / Взаимосвязь.
» WarCraft 3 / Рав коды
» WarCraft 3 / Взаимосвязь.
» WarCraft 3 / Способности и алгоритмы на заказ
Метод: GUI/Jass(только если подробно объясните, что да как, чтобы я мог потом делать подобные)
MUI: обязательно
Цель применения: область с радиусом 200 .
Количество уровней: 3
Описание: Это способность, которая даёт юниту возможность с шансом в 20% нанести х урона по области в позиции атакованного юнита с радиусом 200.
1 уровень 50-200 урона.
2 уровень 100-400 урона.
3 уровень 150-600 урона.
» WarCraft 3 / Синглтаргет в АоЕ
» WarCraft 3 / Взаимосвязь.
» WarCraft 3 / Пассивка